package cn.kgc.itrip.service.impl;

import cn.kgc.itrip.common.*;
import cn.kgc.itrip.dto.Dto;
import cn.kgc.itrip.dto.ItripTokenVO;
import cn.kgc.itrip.mapper.userEmail.UserEmailMapper;
import cn.kgc.itrip.pojo.ItripUser;
import com.alibaba.fastjson.JSON;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.Calendar;

@Service
public class UserLoginServiceImpl  implements UserLoginService{

    @Resource
    private UserEmailMapper userEmailMapper;

    @Resource
    private TokenService tokenService;

    @Resource
    private RedisUtils redisUtils;

    /**
     * 登录
     * @param name
     * @param password
     * @param userAgent
     * @return
     */
    @Override
    public Dto login(String name, String password, String userAgent)throws Exception{
        //判断用户信息是否为空
        //EmptyUtils工具类判断是否为空
        if (EmptyUtils.isEmpty(name)||EmptyUtils.isEmpty(password)){
            return DtoUtil.returnFail("用户名或密码为空", ErrorCode.AUTH_PARAMETER_ERROR);
        }
        //判断用户是否存在
        ItripUser doRegister = (ItripUser) userEmailMapper.itripDoRegister(name);
        if (null !=doRegister && doRegister.getUserPassword().equals(MD5.getMd5(password,32))){
            //判断用户是否激活
            if (doRegister.getActivated()!=1){
                return DtoUtil.returnFail("用户尚未激活",ErrorCode.AUTH_ILLEGAL_USERCODE);
            }
            //如果激活，生成token
            String token=tokenService.addToken(doRegister,userAgent);
            //将token保存到redis中
            redisUtils.setExpire(token, JSON.toJSONString(doRegister),60*60*24);
            //返回信息
            ItripTokenVO itripTokenVO=new ItripTokenVO();
            itripTokenVO.setToken(token);
            //Calendar.getInstance().getTimeInMillis();获取当前系统时间
            itripTokenVO.setExpTime(Calendar.getInstance().getTimeInMillis()+60*60*24);
            itripTokenVO.setGenTime(Calendar.getInstance().getTimeInMillis());
            return  DtoUtil.returnDataSuccess(itripTokenVO);
        }
        return DtoUtil.returnFail("用户名不存在", ErrorCode.AUTH_PARAMETER_ERROR);
    }

    /**
     * 用户注销
     * @param token
     * @param userAgent
     * @return
     */
    @Override
    public Dto loOut(String token, String userAgent) {
        //判断token是否存在
        if (!redisUtils.isExists(token)){
            return DtoUtil.returnFail("token不存在",ErrorCode.AUTH_TOKEN_INVALID);
        }
        //如果存在，判断token是否被截取
        String[] split = token.split("-");
        //已‘-’为分隔符，并用MD5工具类反编译userAgent,判断token的完整性
        if (!split[4].equals(MD5.getMd5(userAgent,6))){
            //如果token被截取，不安全
            return DtoUtil.returnFail("非法Token",ErrorCode.AUTH_ILLEGAL_USERCODE);
        }
        //如果存在和token安全，那么注销token
        redisUtils.del(token);
        return DtoUtil.returnSuccess("注销成功");
    }
}
